package com.dlyk.config.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.dlyk.DlykServerApplication;
import com.dlyk.model.DicValue;
import com.dlyk.result.DicEnum;

import java.util.List;

/**
 * 称呼转换器（通过内存获取数据）
 */
public class AppellationConverter implements Converter<Integer> {

    /**
     * EasyExcel中的对象是手动new出来的不被Spring容器管理，所以这里无法注入Bean
     * 需要在 程序启动的时候 或者 调度定时任务 将数据写入到内存当中，然后在这里或其他EasyExcel的类使用的时候，从内存当中取出数据
     *
     * 如果不想将数据写入到内存当中，可以自定义一个被Spring容器管理的应用上下文持有器 ApplicationContextHolder ，实现 ApplicationContextAware接口，并实现setApplicationContext()方法
     * 在ApplicationContextHolder类中，定义一个静态的ApplicationContext类型的变量，在setApplicationContext()方法中为其赋值，然后在该类中自定义一个静态方法getApplicationContext()，通过这个方法获取应用上下文
     * 然后可以通过应用上下文获取Bean对象，applicationContext.getBean("Bean的名字")
     */


    /**
     * 将Excel数据（读取单元格）转为Java数据
     *
     * 例如：Excel中的 "先生" ---> Java类中是 18（对应数据库中dic_value表的id）
     */
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {

        // cellData：Excel读取到的数据（例如："先生"，"女士"）
        String cellAppellation = cellData.getStringValue();

        // 从内存中获取字典数据
        List<DicValue> dicValueList = (List<DicValue>) DlykServerApplication.cacheMap.get(DicEnum.APPELLATION.getCode());

        // 遍历字典数据
        for (DicValue dicValue : dicValueList) {
            Integer id = dicValue.getId();
            String value = dicValue.getTypeValue();

            // 如果从Excel读取到的数据和当前字典值一致，则返回对应的id值
            if (cellAppellation.equals(value)) {
                return id;
            }
        }

        return -1;
    }

}

